package edu.upc.cineplanet.repositoryjdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;



import edu.upc.cineplanet.Domain.UsuarioWeb;
import edu.upc.cineplanet.repository.UsuarioWebRepository;


 
@Repository
public class UsuarioWebRepositoryJdbc extends JdbcDaoSupport implements UsuarioWebRepository  {


	@Autowired	
	public UsuarioWebRepositoryJdbc(DataSource dataSource){
		setDataSource(dataSource);
	}
	
	public List<UsuarioWeb> obtenerTodosUsuariosWeb() {
		
		List<UsuarioWeb> usuAdmin = new ArrayList<UsuarioWeb>();
		
		String sql = " SELECT U.Co_Usuario,U.No_usuario,U.No_Apepaterno,U.No_Apematerno,U.Flg_Estado,U.FLG_PREMIUN,U.cO_CINEFAVORITO,u.NO_NRODOCU,u.FE_FECNACI, Clave FROM USUARIO_Web U";
		usuAdmin = getJdbcTemplate().query(sql, new UsuarioRowMapper());
		
		return usuAdmin;
	}	
	
	private class UsuarioRowMapper implements ParameterizedRowMapper<UsuarioWeb>{		
		public UsuarioWeb mapRow(ResultSet rs, int rowNum) throws SQLException{
			UsuarioWeb p = new UsuarioWeb();
			p.setCo_Usuario(rs.getString("Co_Usuario"));
			p.setNo_Usuario(rs.getString("No_Usuario"));
			p.setNo_Apepaterno(rs.getString("No_Apepaterno"));
			p.setNo_Apepaterno(rs.getString("No_Apepaterno"));
			p.setFlg_Estado(rs.getBoolean("Flg_Estado"));
			p.setFLG_PREMIUN(rs.getBoolean("FLG_PREMIUN"));
			p.setCO_CINEFAVORITO(rs.getString("cO_CINEFAVORITO"));
			p.setNo_Nrodocu(rs.getString("NO_NRODOCU"));
			p.setFe_Fecnaci(rs.getString("FE_FECNACI"));
			p.setClave(rs.getString("CLAVE"));
			return p;		
		}		
	}	
	
	public void crearUsuarioWeb(UsuarioWeb usu) {
		
		usu.setCo_Usuario( creaCodigo(usu) );
		
		String sql_usuario_web = "insert into USUARIO_Web (Co_usuario,No_usuario, No_Apepaterno, No_Apematerno , Flg_Estado,Flg_premiun,CO_CINEFAVORITO,NO_NRODOCU,FE_FECNACI,clave) " +  
			         		 "values (?,?,?,?,?,?,?,?,?,?)";
		getJdbcTemplate().update(sql_usuario_web,new Object[]{ usu.getCo_Usuario(),usu.getNo_Usuario(),usu.getNo_Apepaterno(),  
				usu.getNo_Apematerno(), usu.getFlg_Estado(),usu.getFLG_PREMIUN(),usu.getCO_CINEFAVORITO(), usu.getNo_Nrodocu(), usu.getFe_Fecnaci(), usu.getClave() });					
		
	}
	
	public void eliminarUsuario(UsuarioWeb usu) {		
		String sql_usuario_web = "delete from usuario_web where Co_Usuario=?";		
		getJdbcTemplate().update(sql_usuario_web, usu.getCo_Usuario());			
	}
	
	public void actualizarUsuario(UsuarioWeb usua) {
		String sql_usuario_web = "update usuario_web set No_Usuario=?,FLG_PREMIUN =?,CO_CINEFAVORITO=? where Co_Usuario=?";
		getJdbcTemplate().update(sql_usuario_web,usua.getNo_Usuario(), usua.getFLG_PREMIUN(),usua.getCO_CINEFAVORITO() , usua.getCo_Usuario());
	}	
	
	public boolean busquedaUsuario(UsuarioWeb usu) throws RuntimeException {
		String codigo = usu.getCo_Usuario();
		Iterator<UsuarioWeb> itr = obtenerTodosUsuariosWeb().iterator();		
		while (itr.hasNext()){
		    UsuarioWeb usua = itr.next();
		    if( usua.getCo_Usuario().equals(codigo) ){
		    	return true;
		    }		    
		}
		return false;		 
	}
	
	public String mostrarUsuarios(){
		String lista="";		
		int registro=1;
		Iterator<UsuarioWeb> itr = obtenerTodosUsuariosWeb().iterator();		
		while (itr.hasNext()){
		    UsuarioWeb usua = itr.next();
		    lista = lista + registro+ " " + usua.getCo_Usuario()+" "+ usua.getNo_Usuario() +" "+ usua.getFe_Fecnaci() + "\n" ;
		    registro++;
		}		
		return lista;
	}
    	
	public String creaCodigo(UsuarioWeb usu) {
		String codigo;
		String nuevo_codigo;
		String sql = "SELECT (MAX(U.CO_USUARIO)+1) FROM USUARIO_WEB U";
		codigo = getJdbcTemplate().queryForObject(sql, String.class);
		
		nuevo_codigo = codigo;
		int tam = 0,diff = 0;
		if(codigo.length() < 6){
			tam = codigo.length();	
			diff = 6-tam;
			while(diff>0){
				nuevo_codigo = "0"+nuevo_codigo ;
				diff--;
			}						
		}
		return nuevo_codigo;
	}
	
	public boolean validaUsuarioWeb(String dni, String clave){
		boolean existe=false;
		String sql = "SELECT  * FROM USUARIO_WEB WHERE NO_NRODOCU=?";
		UsuarioWeb usua;
		try{
			usua = getJdbcTemplate().queryForObject(sql, new Object[]{dni}, new UsuarioRowMapper());			
			}catch(EmptyResultDataAccessException ex){
				return false;
			}		
		if (usua.getClave().equals(clave) && usua.getNo_Nrodocu().equals(dni) )	existe = true;		
		return existe;		
	}	
	
	public UsuarioWeb ObtenerUsuarioWeb(String dni){
		
		String sql = "SELECT  * FROM USUARIO_WEB WHERE NO_NRODOCU=?";
		UsuarioWeb usua;

		usua = getJdbcTemplate().queryForObject(sql, new Object[]{dni}, new UsuarioRowMapper());			
				
		return usua;		
	}	
	
}
